home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / asm / utils / prodmschecker / prodmschecker.s
Text File  |  1980-01-03  |  19KB  |  875 lines

  1. *******************************************************************************
  2. * DMS-Checker/Adder v1.0 (Pro-DMS-Checker)
  3. * ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  4. * A simple DMS file Checksum checker/adder, checks if the dms file is valid
  5. * and free from DMS-CRC Errors. This checker validates;
  6. *
  7. * » DMS Info Header_ID
  8. * » DMS Info Header CRC`s
  9. * » Individual Track Header_ID`s
  10. * » Individual Track Header CRC`s
  11. * » Individual Track Data CRC`s
  12. *
  13. * It does *NOT* however check the CRC`s for Unpacked Track Data. This would
  14. * require decompression of the entire track which would take considerable time
  15. * The checking that is done however should be sufficient for 99% of cases of
  16. * bad dms-files...
  17. *******************************************************************************
  18. _LVOOpen        =    -$1E
  19. _LVORead        =    -$2A
  20. _LVOFreeMem        =    -$D2
  21. _LVOCloseLibrary    =    -$19E
  22. _LVOExamine        =    -$66
  23. _LVOCacheClearU        =    -$27C
  24. _LVOUnLock        =    -$5A
  25. _LVOOutput        =    -$3C
  26. _LVOWrite        =    -$30
  27. _LVODeleteFile        =    -$48
  28. _LVOOpenLibrary        =    -$228
  29. _LVORename        =    -$4E
  30. _LVOAllocMem        =    -$C6
  31. _LVOClose        =    -$24
  32. _LVOLock        =    -$54
  33.  
  34. AbsExecBase        =    $4
  35. AttnFlags        =    $128
  36. MEMF_CLEAR        =    $10000
  37. MEMF_PUBLIC        =    $1
  38. MODE_NEWFILE        =    $3EE
  39. MODE_OLDFILE        =    $3ED
  40. SHARED_LOCK        =    $FFFFFFFE
  41.  
  42. CALL        macro
  43.         jsr    _LVO\1(a6)
  44.         endm
  45.         
  46.         section    dmscheck,code
  47.  
  48. ProgStart:    lea    DT,a5            ;relative dt-base
  49.         move.l    d0,_ArgLen-DT(a5)
  50.         move.l    a0,_ArgPtr-DT(a5)
  51.         move.l    sp,_OldStack-DT(a5)
  52.         bsr.w    OpenDOS
  53.  
  54. *-------------- Show info about DMS checker..
  55.  
  56.         bsr.w    ParseArgs        ;read CLI Arguments
  57.  
  58. *-------------- Attempt to load the whole DMS into memory...
  59.  
  60.         bsr.w    LoadDMSFile
  61.         tst.l    d0
  62.         beq.s    DMSFileOpen.fail
  63.  
  64. *-------------- Attempt to load DMS Banners to add into memory...
  65.  
  66.         bsr.w    LoadBanners
  67.         bsr.w    CheckDMSFile
  68.         tst.l    d0
  69.         beq.s    ShutDown
  70.  
  71. *-------------- Actually add them to the dms file...
  72.  
  73.         bsr.w    AddBanners
  74.         tst.l    d0
  75.         beq.s    ShutDown
  76.  
  77. *-------------- Save the new DMS back to disk...
  78.  
  79.         bsr.w    WriteNewDMS
  80.         bra.s    ShutDown
  81.  
  82. DMSFileOpen.fail:
  83.         lea    LoadErr.txt(pc),a0
  84.         bsr.w    OSPutStr
  85.         bra.w    ShutDown
  86.  
  87. ShutDown:    move.l    (AbsExecBase).w,a6
  88.         move.l    _TotalBnrSize-DT(a5),d0
  89.         beq.s    FreeFrontMem
  90.         move.l    _TotalBnPt-DT(a5),a1
  91.         CALL    FreeMem
  92.  
  93. FreeFrontMem:    move.l    _FrontMemSize-DT(a5),d0
  94.         beq.s    FreeZeroMem
  95.         move.l    _FrontMemPt-DT(a5),a1
  96.         CALL    FreeMem
  97.  
  98. FreeZeroMem:    move.l    _ZeroMemSize-DT(a5),d0
  99.         beq.s    FreeRearMem
  100.         add.l    #64,d0
  101.         move.l    _ZeroMemPt-DT(a5),a1
  102.         CALL    FreeMem
  103.  
  104. FreeRearMem:    move.l    _RearMemSize-DT(a5),d0
  105.         beq.s    FreeDMSMem
  106.         move.l    _RearMemPt-DT(a5),a1
  107.         CALL    FreeMem
  108.  
  109. FreeDMSMem:    move.l    _DMSFileSize-DT(a5),d0
  110.         beq.s    ExitPrg
  111.         move.l    _DMSMemPt-DT(a5),a1
  112.         CALL    FreeMem
  113.  
  114. ExitPrg:    move.l    _OldStack-DT(a5),sp
  115.         bsr.s    CloseDOS
  116.         moveq    #0,d0
  117.         rts
  118.  
  119. DOSReturnCode:    moveq    #10,d0
  120.         rts
  121.  
  122. OpenDOS:    movem.l    d0-d7/a0-a6,-(sp)
  123.         move.l    (AbsExecBase).w,a6
  124.         lea    DOSName(pc),a1
  125.         moveq    #0,d0
  126.         CALL    OpenLibrary
  127.         move.l    d0,_DOSBase-DT(a5)
  128.         beq.s    DOSError
  129.         move.l    d0,a6
  130.         CALL    Output
  131.         move.l    d0,_Output-DT(a5)
  132.         movem.l    (sp)+,d0-d7/a0-a6
  133.         rts
  134.  
  135. DOSError:    movem.l    (sp)+,d0-d7/a0-a6
  136.         move.l    (sp)+,d0
  137.         bra.s    DOSReturnCode
  138.  
  139. CloseDOS:    movem.l    d0-d7/a0-a6,-(sp)
  140.         move.l    (AbsExecBase).w,a6
  141.         move.l    _DOSBase-DT(a5),d0
  142.         beq.s    NoDOS
  143.         move.l    d0,a1
  144.         CALL    CloseLibrary
  145. NoDOS:        movem.l    (sp)+,d0-d7/a0-a6
  146.         rts
  147.  
  148. OSPutStr:    movem.l    d0-d7/a0-a6,-(sp)
  149.         move.l    _Output-DT(a5),d1
  150.         move.l    a0,d2
  151.         moveq    #0,d3
  152. .getlen:    addq.w    #1,d3
  153.         tst.b    (a0)+
  154.         bne.s    .getlen
  155.         subq.w    #1,d3
  156.         move.l    _DOSBase-DT(a5),a6
  157.         CALL    Write
  158.         movem.l    (sp)+,d0-d7/a0-a6
  159.         rts
  160.  
  161. ParseArgs:    movem.l    d0-d7/a0-a6,-(sp)
  162.         move.l    _ArgLen-DT(a5),d1
  163.         move.l    _ArgPtr-DT(a5),a0
  164.         clr.b    -1(a0,d1.w)
  165.         cmp.l    #1,d1
  166.         beq.s    ShowUsage
  167.  
  168.         moveq    #0,d7
  169.         cmp.b    #'-',(a0)
  170.         bne.s    SetFlags
  171.  
  172.         addq.w    #1,a0
  173. ArgLoop:    subq.w    #1,d1
  174.         move.b    (a0)+,d0
  175.         cmp.b    #' ',d0
  176.         beq.s    ArgsDone
  177.         cmp.b    #'b',d0
  178.         bne.s    CheckFront
  179.         bset    #0,d7
  180.         bra.s    ArgLoop
  181.  
  182. CheckFront:    cmp.b    #'f',d0
  183.         bne.s    CheckTrk0Add
  184.         bset    #2,d7
  185.         bra.s    ArgLoop
  186.  
  187. CheckTrk0Add:    cmp.b    #'t',d0
  188.         bne.s    __ShowUsage
  189.         bset    #3,d7
  190.         bra.s    ArgLoop
  191.  
  192. __ShowUsage:    bra.s    ShowUsage
  193.  
  194. ArgsDone:    tst.b    d7
  195.         beq.s    ShowUsage
  196.  
  197.         subq.w    #2,d1
  198.         tst.w    d1
  199.         beq.s    ShowUsage
  200.  
  201. SetFlags:    move.b    d7,_BnrFlags-DT(a5)
  202.         move.l    a0,_FilenamePt-DT(a5)
  203.         movem.l    (sp)+,d0-d7/a0-a6
  204.         rts
  205.  
  206. ShowUsage:    lea    Usage.txt(pc),a0
  207.         bsr.w    OSPutStr
  208.  
  209.         movem.l    (sp)+,d0-d7/a0-a6
  210.         addq.w    #4,sp
  211.         bra.w    ShutDown
  212.  
  213. LoadDMSFile:    movem.l    d1-d7/a0-a6,-(sp)
  214.  
  215.         lea    Loading.txt(pc),a0
  216.         bsr.w    OSPutStr
  217.         move.l    _FilenamePt-DT(a5),a0
  218.         bsr.w    OSPutStr
  219.  
  220.         move.l    _FilenamePt-DT(a5),a0
  221.         moveq    #0,d0
  222.         bsr.w    LoadFile
  223.         tst.l    d0
  224.         beq.s    LoadDMSFailed
  225.  
  226.         move.l    d0,_DMSFileSize-DT(a5)
  227.         move.l    a0,_DMSMemPt-DT(a5)
  228.         lea    Ok.txt(pc),a0
  229.         bsr.w    OSPutStr
  230.  
  231.         moveq    #1,d0
  232.         movem.l    (sp)+,d1-d7/a0-a6
  233.         rts
  234.  
  235. LoadDMSFailed:    moveq    #0,d0
  236.         movem.l    (sp)+,d1-d7/a0-a6
  237.         rts
  238.  
  239. LoadBanners:    movem.l    d0-d7/a0-a6,-(sp)
  240. LoadFrntBanner:    btst    #2,_BnrFlags-DT(a5)
  241.         beq.s    LoadTrk0Banner
  242.  
  243.         lea    FrntFilename.txt(pc),a0
  244.         moveq    #0,d0
  245.         bsr.w    LoadFile
  246.         tst.l    d0
  247.         bne.s    FrontOk
  248.  
  249.         bclr    #2,_BnrFlags-DT(a5)
  250.         bra.s    LoadTrk0Banner
  251.  
  252. FrontOk:    move.l    a0,_FrontMemPt-DT(a5)
  253.         move.l    d0,_FrontMemSize-DT(a5)
  254. LoadTrk0Banner:    btst    #3,_BnrFlags-DT(a5)
  255.         beq.s    noban2
  256.  
  257.         lea    Trk0Filename.txt(pc),a0
  258.         moveq    #1,d0
  259.         bsr.w    LoadFile
  260.  
  261.         tst.l    d0
  262.         bne.s    CheckLength
  263.  
  264.         bclr    #3,_BnrFlags-DT(a5)
  265.         bra.s    noban2
  266.  
  267. CheckLength:    cmp.l    #960,d0
  268.         beq.s    ZeroOk
  269.  
  270.         move.l    (AbsExecBase).w,a6
  271.         add.l    #64,d0
  272.         move.l    a0,a1
  273.         CALL    FreeMem
  274.  
  275.         lea    NoTrkZeroAdd.txt(pc),a0
  276.         bsr.w    OSPutStr
  277.  
  278.         bclr    #3,_BnrFlags-DT(a5)
  279.         bra.s    noban2
  280.  
  281. ZeroOk:        move.l    a0,_ZeroMemPt-DT(a5)
  282.         move.l    d0,_ZeroMemSize-DT(a5)
  283.         move.l    #('DOS'<<8),(a0)
  284.         add.l    d0,a0
  285.  
  286.         lea    AboutADDY.txt(pc),a1
  287.         moveq    #16-1,d0
  288. IncludeInfo:    move.l    (a1)+,(a0)+
  289.         dbra    d0,IncludeInfo
  290.  
  291. noban2:        btst    #0,_BnrFlags-DT(a5)
  292.         beq.s    ExitLoadBanners
  293.  
  294.         lea    RearFilename.txt(pc),a0
  295.         moveq    #0,d0
  296.         bsr.w    LoadFile
  297.         tst.l    d0
  298.         bne.s    RearOk
  299.  
  300.         bclr    #0,_BnrFlags-DT(a5)
  301.         bra.s    ExitLoadBanners
  302.  
  303. RearOk:        move.l    a0,_RearMemPt-DT(a5)
  304.         move.l    d0,_RearMemSize-DT(a5)
  305. ExitLoadBanners:
  306.         movem.l    (sp)+,d0-d7/a0-a6
  307.         rts
  308.  
  309. *******************************************************************************
  310. * DMS-Track CRC Error Checking Procedure...
  311. *******************************************************************************
  312. ;// Definitions of the DMS-Info Header
  313.  
  314.         rsreset
  315. identifier:    rs.l    1    /* type eg; "FILE" or " PRO"
  316. Infobits        rs.l    1    /* General Purpose flags */
  317. timestamp:    rs.l    1    /* When archive was created */
  318. lowtrack:    rs.w    1    /* Low track in Archive */
  319. hightrack:    rs.w    1    /* High track in Archive */
  320. info_plength:    rs.l    1    /* Total Packed bytes */
  321. info_ulength:    rs.l    1    /* Total UnPacked bytes (of disk) */
  322. OS_Version:    rs.w    1    /* Amiga OS Version used */
  323. OS_Revision:    rs.w    1    /* Amiga OS Revision used */
  324. cpu:        rs.w    1    /* CPU type of machine (680xx, 80x86, etc...) */
  325. cpuco:        rs.w    1    /* CPU coprocessor (68881, 8087, ...) */
  326. machine:    rs.w    1    /* Machine of creator (Amiga, ST, IBM, etc...) */
  327. mextra:        rs.w    1    /* Extra ID information (Machine Specific) */
  328. speed:        rs.w    1    /* CPU speed index (Approximate) */
  329. timecreate:    rs.l    1    /* Time it took to create archive */
  330. version_made_by:rs.w    1    /* What version created it */
  331. version_needed:    rs.w    1    /* What version is needed to extract it */
  332. disktype:    rs.w    1    /* Disk type of archive */
  333. info_cmode:    rs.w    1    /* Compression mode (generally) used */
  334. info_hdrsum:    rs.w    1    /* Header checksum */
  335. INFO_HDR_Size:    rs.w    0
  336.  
  337. ;// Definitions of the DMS-Track Header
  338.         
  339.         rsreset
  340. ident:        rs.w    1    /* "TR" identification */
  341. track:        rs.w    1    /* track number */
  342. flags:        rs.w    1    /* General flags */
  343. plength:    rs.w    1    /* actual packed length */
  344. rlength:    rs.w    1    /* packed pre-RLE length */
  345. ulength:    rs.w    1    /* unpacked length */
  346. cflag:        rs.b    1    /* general purpose compression flag */
  347. cmode:        rs.b    1    /* compression mode used */
  348. checksum:    rs.w    1    /* checksum of unpacked bytes */
  349. datasum:    rs.w    1    /* Data Checksum */
  350. hdrsum:        rs.w    1    /* Header Checksum */
  351. tr_data:    rs.w    0    /* actual tr_data */
  352. TR_HDR_Size:    rs.w    0
  353.         rsreset
  354.  
  355. CheckDMSFile:    movem.l    d1-d7/a0-a6,-(sp)
  356.         move.l    _DMSFileSize-DT(a5),a1
  357.         move.l    _DMSMemPt-DT(a5),a0    ;a0=ptr to dms buffer
  358.         add.l    a0,a1            ;a1=end of dms buffer
  359.         lea    _TmpBuff-DT(a5),a4
  360.  
  361. *-------------- Check DMS-Info Header_ID
  362.  
  363.         cmp.l    #'DMS!',(a0)+        ;skip past to the structure..
  364.         bne.s    NotDMSErr
  365.  
  366. *-------------- Check DMS-Info Header Checksum
  367.  
  368.         moveq    #INFO_HDR_Size-2,d0
  369.         bsr.w    DMSCheckCRC        ;calculate DMS Info Header
  370.         cmp.w    info_hdrsum(a0),d0    ;check header info is okay..
  371.         bne.s    BadInfoErr
  372.  
  373. *-------------- Skip Info header to get to Track_structure
  374.  
  375.         lea    INFO_HDR_Size(a0),a0    ;skip info part..
  376.         sub.l    a3,a3
  377.         moveq    #0,d2
  378.  
  379. CheckTrkLoop:    cmp.l    a1,a0        ;end of dms buffer?
  380.         bge.s    CheckDone    ;we have done our job.. lets exit..
  381.  
  382. *-------------- (TR) TRACK_DATA CRC Checking Phase..
  383.         
  384.         cmp.w    #'TR',(a0)        ;check track_header (id_hd)
  385.         bne.s    TrackHdErr
  386.         move.w    track(a0),d0        ;get track no.
  387.         bne.s    noid
  388.  
  389. *-------------- Get track info for kill/add... if its a TEXT type track
  390.  
  391.         move.l    a4,a3
  392. noid:        move.w    d0,(a4)+        ;save trk no.
  393.         move.l    a0,(a4)+        ;header ptr
  394.         move.w    plength(a0),(a4)    ;cmode packed
  395.         add.w    #20,(a4)+
  396.  
  397. *-------------- Calculate Header_CRC
  398.  
  399.         moveq    #TR_HDR_Size-2,d0    ;length of checksum (headerlen)
  400.         bsr.s    DMSCheckCRC
  401.         cmp.w    hdrsum(a0),d0        ;compare header crc (hcrc)
  402.         bne.s    TrkHdCorruptErr
  403.  
  404. *-------------- Calculate Trackdata_CRC
  405.  
  406.         move.w    plength(a0),d0        ;actual packed length
  407.         move.w    datasum(a0),d1        ;packed data crc
  408.         lea    tr_data(a0),a0        ;a0=ptr to packed data
  409.         move.l    d0,d2
  410.         bsr.s    DMSCheckCRC
  411.         cmp.w    d0,d1            ;packed data crc with current
  412.         bne.s    CorruptTrkErr        ;is packed track data corrupt?
  413.  
  414. *-------------- Point to next track
  415.  
  416.         add.l    d2,a0            ;point to next track..
  417.         bra.s    CheckTrkLoop
  418.  
  419. CheckDone:    move.l    a3,_DMSTrkPt-DT(a5)    ;save Last Track Ptr..
  420.  
  421. *-------------- File Passed CRC_Checking...
  422.  
  423.         lea    FileOkay.txt(pc),a0
  424.         bsr.w    OSPutStr
  425.  
  426.         moveq    #1,d0
  427.         movem.l    (sp)+,d1-d7/a0-a6
  428.         rts
  429.  
  430.  
  431.  
  432. NotDMSErr:    lea    NotDMS.txt(pc),a0
  433.         bra.s    ShowMsg
  434.  
  435. BadInfoErr:    lea    InfoHeader.txt(pc),a0
  436.         bra.s    ShowMsg
  437.  
  438. TrackHdErr:    lea    TrackHdError.txt(pc),a0
  439.         bra.s    ShowMsg
  440.  
  441. TrkHdCorruptErr:
  442.         lea    TrackHdCorrupt.txt(pc),a0
  443.         bra.s    ShowMsg
  444.  
  445. CorruptTrkErr:    lea    TrackCorrupt.txt(pc),a0
  446. ShowMsg:    bsr.w    OSPutStr
  447.  
  448.         moveq    #0,d0
  449.         movem.l    (sp)+,d1-d7/a0-a6
  450.         rts
  451.  
  452. *******************************************************************************
  453. * Calculate CRC (16-Bit)
  454. * ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  455. * $Inputs:    d0.l = Length
  456. *        a0.l = Source Ptr.
  457. *
  458. * $Outputs:    d0.l = CRC
  459. *******************************************************************************
  460.  
  461. DMSCheckCRC:    movem.l    d1/d2/a0/a1,-(sp)
  462.         lea    CRC_TAB(pc),a1
  463.         subq.w    #1,d0
  464.         moveq    #0,d1
  465.         moveq    #8,d3
  466. .calcsum:    moveq    #0,d2
  467.         move.b    (a0)+,d2
  468.         eor.b    d1,d2
  469.         add.w    d2,d2
  470.         lsr.w    d3,d1
  471.         move.w    0(a1,d2.w),d2
  472.         eor.w    d2,d1
  473.         dbra    d0,.calcsum
  474.         move.w    d1,d0
  475.         movem.l    (sp)+,d1/d2/a0/a1
  476.         rts
  477.  
  478. AddBanners:    movem.l    d1-d7/a0-a6,-(sp)
  479.         moveq    #60,d0
  480.         add.l    _DMSFileSize-DT(a5),d0
  481.         add.l    _FrontMemSize-DT(a5),d0
  482.         add.l    _ZeroMemSize-DT(a5),d0
  483.         add.l    _RearMemSize-DT(a5),d0
  484.         move.l    d0,_TotalBnrSize-DT(a5)
  485.         move.l    (AbsExecBase).w,a6
  486.         moveq    #1,d1
  487.         CALL    AllocMem
  488.  
  489.         move.l    d0,_TotalBnPt-DT(a5)
  490.         beq.w    NoBnrMemErr
  491.  
  492.         move.l    d0,a1
  493.         move.l    _DMSMemPt-DT(a5),a0
  494.         moveq    #14-1,d0
  495. .copyheader:    move.l    (a0)+,(a1)+
  496.         dbra    d0,.copyheader
  497.  
  498. TestFrontAdd:    btst    #2,_BnrFlags-DT(a5)
  499.         beq.s    TestTrk0Add
  500.  
  501.         move.l    _FrontMemPt-DT(a5),a2
  502.         move.l    _FrontMemSize-DT(a5),d1
  503.         move.l    a2,a0
  504.         move.l    d1,d0
  505.         bsr.s    DMSCheckCRC
  506.  
  507.         move.l    d0,d6
  508.         move.l    a2,a0
  509.         move.l    d1,d0
  510.         bsr.w    CalcBannerCRC
  511.  
  512.         move.l    d0,d7
  513.         move.l    a1,a0
  514.         move.w    #'TR',(a1)+
  515.         move.w    #$FFFF,(a1)+
  516.         move.l    d1,(a1)+
  517.         move.w    d1,(a1)+
  518.         move.w    d1,(a1)+
  519.         clr.w    (a1)+
  520.         move.w    d7,(a1)+
  521.         move.w    d6,(a1)+
  522.         moveq    #18,d0
  523.         bsr.w    DMSCheckCRC
  524.  
  525.         move.w    d0,(a1)+
  526.         subq.w    #1,d1
  527. addcrc_front:    move.b    (a2)+,(a1)+
  528.         dbra    d1,addcrc_front
  529.  
  530. TestTrk0Add:    btst    #3,_BnrFlags-DT(a5)
  531.         beq.s    CheckRearAdd
  532.  
  533.         move.l    _ZeroMemPt-DT(a5),a2
  534.         move.l    #1024,d1
  535.         move.l    a2,a0
  536.         move.l    d1,d0
  537.         bsr.w    DMSCheckCRC
  538.  
  539.         move.l    d0,d6
  540.         move.l    a2,a0
  541.         move.l    d1,d0
  542.         bsr.w    CalcBannerCRC
  543.  
  544.         move.l    d0,d7
  545.         move.l    a1,a0
  546.         move.w    #'TR',(a1)+
  547.         clr.w    (a1)+
  548.         move.l    d1,(a1)+
  549.         move.w    d1,(a1)+
  550.         move.w    d1,(a1)+
  551.         clr.w    (a1)+
  552.         move.w    d7,(a1)+
  553.         move.w    d6,(a1)+
  554.         moveq    #18,d0
  555.         bsr.w    DMSCheckCRC
  556.  
  557.         move.w    d0,(a1)+
  558.         subq.w    #1,d1
  559. .byteinsert:    move.b    (a2)+,(a1)+
  560.         dbra    d1,.byteinsert
  561.  
  562. CheckRearAdd:    move.l    _DMSTrkPt-DT(a5),a0
  563.         cmp.l    #0,a0
  564.         beq.s    GetLastTrack
  565.  
  566.         move.w    6(a0),d0
  567.         move.l    2(a0),a0
  568.         subq.w    #1,d0
  569. .bytecpy:    move.b    (a0)+,(a1)+
  570.         dbra    d0,.bytecpy
  571.  
  572. GetLastTrack:    lea    _TmpBuff-DT(a5),a4
  573. findlast_trk:    move.w    (a4)+,d1
  574.         move.l    (a4)+,a0
  575.         move.w    (a4)+,d0
  576.         cmp.l    #0,a0
  577.         beq.s    TestAddRear
  578.  
  579.         tst.b    d1
  580.         beq.s    findlast_trk
  581.  
  582.         cmp.w    #$FFFF,d1
  583.         beq.s    findlast_trk
  584.  
  585.         subq.w    #1,d0
  586. .bytecopy2:    move.b    (a0)+,(a1)+
  587.         dbra    d0,.bytecopy2
  588.         bra.s    findlast_trk
  589.  
  590. TestAddRear:    btst    #0,_BnrFlags-DT(a5)
  591.         beq.s    TestFreeBnrMem
  592.  
  593.         move.l    _RearMemPt-DT(a5),a2
  594.         move.l    _RearMemSize-DT(a5),d1
  595.         move.l    a2,a0
  596.         move.l    d1,d0
  597.         bsr.w    DMSCheckCRC
  598.  
  599.         move.l    d0,d6
  600.         move.l    a2,a0
  601.         move.l    d1,d0
  602.         bsr.s    CalcBannerCRC
  603.  
  604.         move.l    d0,d7
  605.         move.l    a1,a0
  606.         move.w    #'TR',(a1)+
  607.         move.w    #$FFFF,(a1)+
  608.         move.l    d1,(a1)+
  609.         move.w    d1,(a1)+
  610.         move.w    d1,(a1)+
  611.         clr.w    (a1)+
  612.         move.w    d7,(a1)+
  613.         move.w    d6,(a1)+
  614.         moveq    #18,d0
  615.         bsr.w    DMSCheckCRC
  616.  
  617.         move.w    d0,(a1)+
  618.         subq.w    #1,d1
  619. .bytecopy4:    move.b    (a2)+,(a1)+
  620.         dbra    d1,.bytecopy4
  621.  
  622. TestFreeBnrMem:    move.l    _TotalBnPt-DT(a5),a0
  623.         sub.l    a0,a1
  624.         move.l    a1,_TotalBnrNewSize-DT(a5)
  625.  
  626.         move.l    (AbsExecBase).w,a6
  627.         cmp.w    #37,20(a6)        ;Has OS Got Cache Control?
  628.         blt.s    NoFreeCache
  629.  
  630.         CALL    CacheClearU        ;if so Flush`em!
  631.  
  632. NoFreeCache:    moveq    #1,d0
  633.         movem.l    (sp)+,d1-d7/a0-a6
  634.         rts
  635.  
  636. NoBnrMemErr:    lea    NoRemoveAdd.txt(pc),a0
  637.         bsr.w    OSPutStr
  638.  
  639.         moveq    #0,d0
  640.         movem.l    (sp)+,d1-d7/a0-a6
  641.         rts
  642.  
  643. CalcBannerCRC:    movem.l    d1/d2/a0,-(sp)
  644.         subq.w    #1,d0
  645.         moveq    #0,d2
  646.         moveq    #0,d1
  647. .crcmake:    move.b    (a0)+,d1
  648.         add.w    d1,d2
  649.         dbra    d0,.crcmake
  650.         move.l    d2,d0
  651.         movem.l    (sp)+,d1/d2/a0
  652.         rts
  653.  
  654. WriteNewDMS:    movem.l    d0-d7/a0-a6,-(sp)
  655.         move.l    _FilenamePt-DT(a5),a0
  656.         lea    _TmpBuff-DT(a5),a1
  657. cpy_fname:    move.b    (a0)+,(a1)+
  658.         bne.s    cpy_fname
  659.  
  660.         move.b    #'.',-1(a1)
  661.         move.b    #'t',(a1)+
  662.         move.b    #'m',(a1)+
  663.         move.b    #'p',(a1)+
  664.         clr.b    (a0)+
  665.         move.l    _DOSBase-DT(a5),a6
  666.         move.l    _FilenamePt-DT(a5),d1
  667.         lea    _TmpBuff-DT(a5),a2
  668.         move.l    a2,d2
  669.         jsr    _LVORename(a6)
  670.  
  671.         tst.l    d0
  672.         beq.s    _NoRemoveErr
  673.  
  674.         move.l    _FilenamePt-DT(a5),d1
  675.         move.l    #MODE_NEWFILE,d2
  676.         jsr    _LVOOpen(a6)
  677.         move.l    d0,d7
  678.         beq.s    RenameTmp
  679.  
  680.         move.l    d7,d1
  681.         move.l    _TotalBnPt-DT(a5),d2
  682.         move.l    _TotalBnrNewSize-DT(a5),d3
  683.         jsr    _LVOWrite(a6)
  684.  
  685.         move.l    d0,d4
  686. RemClose:    move.l    d7,d1
  687.         jsr    _LVOClose(a6)
  688.         tst.l    d0
  689.         beq.s    RemClose
  690.  
  691.         cmp.l    d3,d4
  692.         bne.s    ZapTempFile
  693.  
  694.         lea    _TmpBuff-DT(a5),a1
  695.         move.l    a1,d1
  696.         jsr    _LVODeleteFile(a6)
  697.  
  698.         movem.l    (sp)+,d0-d7/a0-a6
  699.         rts
  700.  
  701. ZapTempFile:    move.l    _FilenamePt-DT(a5),d1
  702.         jsr    _LVODeleteFile(a6)
  703.  
  704. RenameTmp:    lea    _TmpBuff-DT(a5),a1
  705.         move.l    a1,d1
  706.         move.l    _FilenamePt-DT(a5),d2
  707.         jsr    _LVORename(a6)
  708.  
  709. _NoRemoveErr:    lea    NoRemoveAdd.txt(pc),a0
  710.         bsr.w    OSPutStr
  711.         movem.l    (sp)+,d0-d7/a0-a6
  712.         rts
  713.  
  714. LoadFile:    movem.l    d1-d7/a1-a6,-(sp)
  715.         move.l    d0,_ExtraMemFlg-DT(a5)
  716.         moveq    #0,d6
  717.         moveq    #0,d5
  718.         moveq    #0,d4
  719.         sub.l    a3,a3
  720.         move.l    a0,d7
  721.         move.l    _DOSBase-DT(a5),a6
  722.         move.l    d7,d1
  723.         moveq    #SHARED_LOCK,d2
  724.         jsr    _LVOLock(a6)
  725.         move.l    d0,d6
  726.         beq.s    OpenError
  727.  
  728.         move.l    d6,d1
  729.         lea    _DTBase-DT(a5),a4
  730.         move.l    a4,d2
  731.         jsr    _LVOExamine(a6)
  732.         tst.l    d0
  733.         beq.s    OpenError
  734.  
  735.         move.l    124(a4),d5
  736.         move.l    (AbsExecBase).w,a6
  737.         move.l    d5,d0
  738.         cmp.l    #1,_ExtraMemFlg-DT(a5)
  739.         bne.s    NoExtraParam
  740.  
  741.         add.l    #64,d0
  742. NoExtraParam:    move.l    #(MEMF_PUBLIC+MEMF_CLEAR),d1
  743.         jsr    _LVOAllocMem(a6)
  744.         tst.l    d0
  745.         beq.s    OpenError
  746.  
  747.         move.l    d0,a3
  748.         move.l    _DOSBase-DT(a5),a6
  749.         move.l    d7,d1
  750.         move.l    #MODE_OLDFILE,d2
  751.         jsr    _LVOOpen(a6)
  752.         tst.l    d0
  753.         beq.s    OpenError
  754.  
  755.         move.l    d0,a4
  756.         move.l    a4,d1
  757.         move.l    a3,d2
  758.         move.l    d5,d3
  759.         jsr    _LVORead(a6)
  760.         exg    d0,a4
  761.         move.l    d0,d1
  762.         jsr    _LVOClose(a6)
  763.         cmp.l    d5,a4
  764.         bne.s    OpenError
  765.         moveq    #0,d7
  766.         bsr.s    UnlockFile
  767.  
  768.         move.l    d5,d0
  769.         move.l    a3,a0
  770.         movem.l    (sp)+,d1-d7/a1-a6
  771.         rts
  772.  
  773. OpenError:    moveq    #1,d7
  774.         move.l    a3,a1
  775.         cmp.l    #0,a1
  776.         beq.s    UnlockFile
  777.         move.l    d5,d0
  778.         beq.s    UnlockFile
  779.  
  780.         move.l    (AbsExecBase).w,a6
  781.         jsr    _LVOFreeMem(a6)
  782.  
  783. UnlockFile:    tst.l    d6
  784.         beq.s    NoLock
  785.  
  786.         move.l    _DOSBase-DT(a5),a6
  787.         move.l    d6,d1
  788.         jsr    _LVOUnLock(a6)
  789.  
  790. NoLock:        tst.l    d7
  791.         bne.s    FreeFile
  792.         rts
  793.  
  794. FreeFile:    moveq    #0,d0
  795.         sub.l    a0,a0
  796.         movem.l    (sp)+,d1-d7/a1-a6
  797.         rts
  798.  
  799. Usage.txt:        dc.b    $a,'Usage : DMSValid [-<options>] <filename>',$A
  800.             dc.b    'b Add to Rear, f Add to Front, t Add to Trk 0.',$a
  801.             dc.b    $A,$A,0
  802. Loading.txt:        dc.b    $a,'Examining file for DMS Checking...',$a,'Loading... ',0
  803. NotDMS.txt:        dc.b    10,"This is not a DMS file!",$a,0
  804. InfoHeader.txt:        dc.b    10,"Error: Info Header Corrupt!",$a,0
  805. TrackHdError.txt:    dc.b    10,"Error: Track Header Error!",$a,0
  806. TrackHdCorrupt.txt:    dc.b    10,"Error: Track Header Corrupt!",$a,0
  807. TrackCorrupt.txt:    dc.b    10,"Error: Track Data Corrupt!",$a,0
  808. NoRemoveAdd.txt:    dc.b    10,"Note: Skipped Removing/adding of Banners, Not Enough Memory!",10,10,0
  809. NoTrkZeroAdd.txt:    dc.b    10,"Error: TRK0-Banner text should be 960 bytes long!",$a,0
  810. Ok.txt:            dc.b    '... Done',10,0
  811. FileOkay.txt:        dc.b    10,"DMS-File Passed CRC Checking!",0
  812. LoadErr.txt:        dc.b    10,10,"Error: Unable to Open file.",10,0
  813.  
  814. FrntFilename.txt:    dc.b    'S:PDC_Banner_Front',0
  815. Trk0Filename.txt:    dc.b    'S:PDC_Track_Zero',0
  816. RearFilename.txt:    dc.b    'S:PDC_Banner_Rear',0
  817.  
  818. AboutADDY.txt:    dc.b    "`---- PrO-DmScHeCk ----- by ExOdOuS/ TLS, XPress & O.T.T  ----''",$A,0
  819. DOSName:    dc.b    'dos.library',0
  820.         even
  821.  
  822. CRC_TAB        dc.l    $0000C0C1,$C1810140,$C30103C0,$0280C241,$C60106C0
  823.         dc.l    $0780C741,$0500C5C1,$C4810440,$CC010CC0,$0D80CD41
  824.         dc.l    $0F00CFC1,$CE810E40,$0A00CAC1,$CB810B40,$C90109C0
  825.         dc.l    $0880C841,$D80118C0,$1980D941,$1B00DBC1,$DA811A40
  826.         dc.l    $1E00DEC1,$DF811F40,$DD011DC0,$1C80DC41,$1400D4C1
  827.         dc.l    $D5811540,$D70117C0,$1680D641,$D20112C0,$1380D341
  828.         dc.l    $1100D1C1,$D0811040,$F00130C0,$3180F141,$3300F3C1
  829.         dc.l    $F2813240,$3600F6C1,$F7813740,$F50135C0,$3480F441
  830.         dc.l    $3C00FCC1,$FD813D40,$FF013FC0,$3E80FE41,$FA013AC0
  831.         dc.l    $3B80FB41,$3900F9C1,$F8813840,$2800E8C1,$E9812940
  832.         dc.l    $EB012BC0,$2A80EA41,$EE012EC0,$2F80EF41,$2D00EDC1
  833.         dc.l    $EC812C40,$E40124C0,$2580E541,$2700E7C1,$E6812640
  834.         dc.l    $2200E2C1,$E3812340,$E10121C0,$2080E041,$A00160C0
  835.         dc.l    $6180A141,$6300A3C1,$A2816240,$6600A6C1,$A7816740
  836.         dc.l    $A50165C0,$6480A441,$6C00ACC1,$AD816D40,$AF016FC0
  837.         dc.l    $6E80AE41,$AA016AC0,$6B80AB41,$6900A9C1,$A8816840
  838.         dc.l    $7800B8C1,$B9817940,$BB017BC0,$7A80BA41,$BE017EC0
  839.         dc.l    $7F80BF41,$7D00BDC1,$BC817C40,$B40174C0,$7580B541
  840.         dc.l    $7700B7C1,$B6817640,$7200B2C1,$B3817340,$B10171C0
  841.         dc.l    $7080B041,$500090C1,$91815140,$930153C0,$52809241
  842.         dc.l    $960156C0,$57809741,$550095C1,$94815440,$9C015CC0
  843.         dc.l    $5D809D41,$5F009FC1,$9E815E40,$5A009AC1,$9B815B40
  844.         dc.l    $990159C0,$58809841,$880148C0,$49808941,$4B008BC1
  845.         dc.l    $8A814A40,$4E008EC1,$8F814F40,$8D014DC0,$4C808C41
  846.         dc.l    $440084C1,$85814540,$870147C0,$46808641,$820142C0
  847.         dc.l    $43808341,$410081C1,$80814040
  848.  
  849.         section    dmscheckbss,bss
  850. DT:
  851. _DTBase:    ds.l    260
  852. _OldStack:    ds.l    1
  853. _DOSBase:    ds.l    1
  854. _ArgLen:    ds.l    1
  855. _ArgPtr:    ds.l    1
  856. _FilenamePt:    ds.l    1
  857. _BnrFlags:    ds.w    1
  858. _Output:    ds.l    1
  859. _ExtraMemFlg:    ds.l    1
  860. _DMSMemPt:    ds.l    1
  861. _DMSFileSize:    ds.l    1
  862. _FrontMemPt:    ds.l    1
  863. _FrontMemSize:    ds.l    1
  864. _ZeroMemPt:    ds.l    1
  865. _ZeroMemSize:    ds.l    1
  866. _RearMemPt:    ds.l    1
  867. _RearMemSize:    ds.l    1
  868. _TotalBnrSize:    ds.l    1
  869. _TotalBnPt:    ds.l    1
  870. _TotalBnrNewSize:    ds.l    1
  871. _DMSTrkPt:    ds.l    1
  872. _TmpBuff:    ds.b    1282
  873.  
  874.         end
  875.